package com.example.h3;

import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView tvEventInfo;
    private Button btnInnerClass, btnAnonymousClass, btnActivityListener, btnXmlClick, system_info_activity_btn, exec;
    // 该程序模拟填充长度为100的数组
    private int[] data = new int[100];
    int hasData = 0;
    // 定义进度对话框的标识
    final int PROGRESS_DIALOG = 0x112;
    // 记录进度对话框的完成百分比
    int progressStatus = 0;
    ProgressDialog pd;
    // 定义一个负责更新的进度的Handler
    Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvEventInfo = findViewById(R.id.tv_event_info);
        btnInnerClass = findViewById(R.id.btn_inner_class);
        btnAnonymousClass = findViewById(R.id.btn_anonymous_class);
        btnActivityListener = findViewById(R.id.btn_activity_listener);
        btnXmlClick = findViewById(R.id.btn_xml_click);
        system_info_activity_btn = findViewById(R.id.system_info_activity_btn);
        exec = findViewById(R.id.exec);

        // 1. 内部类方式
        btnInnerClass.setOnClickListener(new MyClickListener());

        // 2. 匿名内部类方式
        btnAnonymousClass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tvEventInfo.setText("事件处理方式: 匿名内部类");
            }
        });

        // 3. Activity实现接口方式
        btnActivityListener.setOnClickListener(this);

        system_info_activity_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SystemInfoActivity.class);
                startActivity(intent);
            }
        });

        exec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog(PROGRESS_DIALOG);
            }
        });

        // 初始化Handler
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what == 0x123) {
                    pd.setProgress(progressStatus);
                }
            }
        };
    }

    // 内部类实现点击监听器
    class MyClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            tvEventInfo.setText("事件处理方式: 内部类");
        }
    }

    // Activity实现OnClickListener接口
    public void onClick(View v) {
        if (v.getId() == R.id.btn_activity_listener) {
            tvEventInfo.setText("事件处理方式: Activity实现接口");
        }
    }

    // XML中onClick属性指定的方法
    public void onXmlClick(View v) {
        tvEventInfo.setText("事件处理方式: XML onClick属性");
    }

    @Override
    public Dialog onCreateDialog(int id, Bundle status) {
        System.out.println("------create------");
        switch (id) {
            case PROGRESS_DIALOG:
                // 创建进度对话框
                pd = new ProgressDialog(this);
                pd.setMax(100);
                // 设置对话框的标题
                pd.setTitle("任务完成百分比");
                // 设置对话框显示的内容
                pd.setMessage("耗时任务的完成百分比");
                // 设置对话框不能用"取消"按钮关闭
                pd.setCancelable(false);
                // 设置对话框的进度条风格
                pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                // 设置对话框的进度条是否显示进度
                pd.setIndeterminate(false);
                break;
        }
        return pd;
    }

    // 该方法将在onCreateDialog方法调用之后被回调
    @Override
    public void onPrepareDialog(int id, Dialog dialog) {
        System.out.println("------prepare------");
        super.onPrepareDialog(id, dialog);
        switch (id) {
            case PROGRESS_DIALOG:
                // 对话框进度清零
                pd.incrementProgressBy(-pd.getProgress());
                progressStatus = 0;
                hasData = 0;
                new Thread() {
                    public void run() {
                        while (progressStatus < 100) {
                            // 获取耗时操作的完成百分比
                            progressStatus = doWork();
                            // 发送消息到Handler
                            handler.sendEmptyMessage(0x123);
                        }
                        // 如果任务已经完成
                        if (progressStatus >= 100) {
                            // 关闭对话框
                            pd.dismiss();
                        }
                    }
                }.start();
                break;
        }
    }

    // 模拟一个耗时的操作
    public int doWork() {
        // 为数组元素赋值
        data[hasData++] = (int) (Math.random() * 100);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return hasData;
    }
}